package com.liuyi.tools.web.resp;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * @author Mr.fmy
 * @version 1.0.0
 * @ClassName Resp
 * @Description TODO 返回参数实体类接口
 * @createTime 2020/3/27 09:34
 */
public interface Resp<T extends Resp> {

    /**
     * 获取所有枚举字段名，首字母大写
     */
    String[] enumKeys();

    /**
     * 填充所有枚举名
     * 这里的意思是每个枚举在他的resp类中都要有与之对应的 英文字段并加入到字符串数组中
     */
    default void enumNameWrap() {
        String[] keys = enumKeys();
        Class<? extends Resp> c = this.getClass();
        for (String k : keys) {
            try {
                // 循环所有的字符串数组 并获取其中相关的枚举的get方法
                Method m = c.getMethod(("get" + k));
                // 执行get方法并获取到枚举对象
                Object v = m.invoke(this);
                // 拦截所有不为空的枚举类类型
                if (v != null && v.getClass().isEnum()) {
                    // 获取到另外一些字段的set方法
                    Method setM = c.getMethod("set" + k + "En", String.class);
                    Enum e = (Enum) v;
                    setM.invoke(this, e.name());
                }
            } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 数据包装处理
     */
    default void wrapper() {
        enumNameWrap();
    }
}
